package middleware

import (
	"net/http"
	"strings"

	"github.com/gin-gonic/gin"
)

// PermissionMiddleware 权限校验中间件
// 用于保护需要特定角色或权限的接口
// 用法：router.Use(PermissionMiddleware("admin")) 或 PermissionMiddleware("product:edit")
// 支持传入多个角色/权限，只要满足其中一个即可通过
func PermissionMiddleware(required ...string) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		// 假设用户角色和权限已通过 JWT 或其他方式写入 ctx（如 ctx.Set("roles", []string{"admin"})）
		roles, _ := ctx.Get("roles")
		permissions, _ := ctx.Get("permissions")

		roleList, _ := roles.([]string)
		permList, _ := permissions.([]string)

		// 检查是否有满足的角色或权限
		for _, req := range required {
			if contains(roleList, req) || contains(permList, req) {
				ctx.Next()
				return
			}
		}

		// 无权限，返回 403
		ctx.AbortWithStatusJSON(http.StatusForbidden, gin.H{
			"code":    http.StatusForbidden,
			"message": "无权限访问",
		})
	}
}

// contains 判断字符串切片中是否包含某个值
func contains(list []string, val string) bool {
	for _, v := range list {
		if strings.EqualFold(v, val) {
			return true
		}
	}
	return false
}
